/**
 * Alipay.com Inc.
 * Copyright (c) 2004-2011 All Rights Reserved.
 */
package com.liwei.nio.mina;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**
*
* @author lidian
* @version $Id: MinaTimeServer.java, v 0.1 2011-1-27 上午09:28:44 lidian Exp $
*/
public class MinaTimeServer {
    private static final int PORT   = 2500;
    //调用工厂方法，得到一个日志记录器，我用的是自己最熟悉的Log4j  
    //slf4j本身是一个Facade，或者说象集群服务中的分发器，它本身没有Logger的记录功能  
    //它会自动根据Classpath中的具体Logger类库来实现具体调用，在LoggerFactory实例化Logger  
    static Logger            logger = LoggerFactory.getLogger(MinaTimeServer.class);

    public static void main(String[] args) throws IOException {
        //在服务器端创建一个接收器  
        IoAcceptor acceptor = new NioSocketAcceptor();

        //创建一个日志过滤器进行日志处理，并添加到过滤器链的第一个位置  
        //过滤器的位置很重要，在这里因为放到了第一个位置，它会记录原始字节码数据  

        LoggingFilter lf = new LoggingFilter("testLog");
        acceptor.getFilterChain().addLast("logger", lf);

        //增加一个按行进行处理文本的编解码过滤器，并且指定按GBK的方法进行编解码  
        acceptor.getFilterChain().addLast("codec",
            new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("GBK"))));

        //进行配置信息的设置  
        acceptor.getSessionConfig().setReadBufferSize(10);
        acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);

        //添加一个数据处理器，对接收或发送的数据进行处理  
        acceptor.setHandler(new TimeServerHandler());

        //把IoAccepter绑定到指定的2500端口          
        acceptor.bind(new InetSocketAddress(PORT));
        System.out.println("start server ...");
    }
}

class TimeServerHandler extends IoHandlerAdapter {
    static Logger logger = LoggerFactory.getLogger(TimeServerHandler.class);

    //static Logger logger = Logger.getLogger(TimeServerHandler.class);  
    //异常处理  
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
        cause.printStackTrace();
    }

    //对接收到的数据进行业务处理，在这里我们不管收到什么信息都返回一个当前的日期  
    public void messageReceived(IoSession session, Object message) throws Exception {
        String str = message.toString();
        if (str.trim().equalsIgnoreCase("quit")) {
            session.close(true);
            return;
        }
        logger.debug("Rec:" + str);
        Date date = new Date();
        session.write(date.toString());
        logger.debug("Message written...");
    }

    //当连接空闲时的处理  
    public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
        logger.debug("IDLE " + session.getIdleCount(status));
    }

}